package com.hhxy.stream;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * 用于判断部门员工中最高薪水
 */
public class StreamDemo1 {
    static double allMoney = 0;//用来工资求和
    public static void main(String[] args) {
        //开发一部：
        List<Employee> one = new ArrayList<>();
        one.add(new Employee("张三", '男', 3000, 1000, null));
        one.add(new Employee("李四", '男', 4000, 2000, "顶撞上司"));
        one.add(new Employee("Lisa", '女', 5000, 3000, null));
        //开发二部：
        List<Employee> two = new ArrayList<>();
        one.add(new Employee("赵六", '女', 2500, 1500, "迟到"));
        one.add(new Employee("钱七", '女', 3500, 2500, null));
        one.add(new Employee("王八", '男', 4500, 3500, null));
/*        //寻早开发一部员工最高工资
        Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).get();
        System.out.println(e);*/
        //1.将开发一部工最高工资员工对象封装成Topperformer对象
        Topperformer t =
                one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                        .map(e -> new Topperformer(e.getName(), (e.getSalary() + e.getBonus()))).get();
        System.out.println(t);//Topperformer{name='Lisa', money=8000.0}
/*        //使用sorted()按照工资进行升序排序
        one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .forEach(e -> System.out.println(e));*/

/*        //使用skip()和limt()去掉最高工资和最低工资
        one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .skip(1).limit(one.size()-2);
        //skip(1)：去掉排序后的第一个对象
        //limit(one.size()-2)：在去掉第一个的基础上不取最后一个*/
/*        //利用静态变量allMoney求平均值
        one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .skip(1).limit(one.size()-2).forEach(e->{
                    allMoney += (e.getSalary()+e.getBonus());
        });
        System.out.println("开发一部的平均工资："+allMoney/(one.size()-2));*/

        //3.合并两个开发部门的Stream流，然后去掉最高、最低工资，然后求取平均值
        Stream<Employee> s1 = one.stream();
        Stream<Employee> s2 = two.stream();
        Stream<Employee> s3 = Stream.concat(s1,s2);
        s3.sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus()))
                .skip(1).limit(one.size()+two.size()-2).forEach(e->{
                    allMoney += (e.getSalary()+e.getBonus());
        });
        //求平均数时，使用BigDecimal进行精确计算（因为计算机底层很难实现精确）
        BigDecimal a = BigDecimal.valueOf(allMoney);
        BigDecimal b = BigDecimal.valueOf(one.size()+two.size()-2);
        //可能存在除不尽的问题,进行四舍五入
        System.out.println("开发一部和开发二部的平均工资："+a.divide(b,2, RoundingMode.HALF_UP));//6000
    }
}
